/**
 * 验证邮箱格式
 * @param {string} email - 待验证的邮箱
 * @returns {boolean} 是否为有效邮箱
 */
export const isEmail = (email) => {
  if (!email) return false;
  // 简单邮箱正则（可根据需求调整）
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
};

/**
 * 验证手机号格式（中国大陆）
 * @param {string|number} phone - 待验证的手机号
 * @returns {boolean} 是否为有效手机号
 */
export const isPhone = (phone) => {
  if (!phone) return false;
  const strPhone = String(phone);
  // 11位数字，以1开头
  const regex = /^1[3-9]\d{9}$/;
  return regex.test(strPhone);
};

/**
 * 验证密码强度（至少8位，包含字母和数字）
 * @param {string} password - 待验证的密码
 * @returns {boolean} 是否符合密码规则
 */
export const isStrongPassword = (password) => {
  if (!password) return false;
  // 至少8位，包含至少一个字母和一个数字
  const regex = /^(?=.*[A-Za-z])(?=.*\d).{8,}$/;
  return regex.test(password);
};

/**
 * 验证是否为URL地址
 * @param {string} url - 待验证的URL
 * @returns {boolean} 是否为有效URL
 */
export const isUrl = (url) => {
  if (!url) return false;
  try {
    new URL(url);
    return true;
  } catch (e) {
    return false;
  }
};

/**
 * 验证字符串是否为空（排除纯空格）
 * @param {string} str - 待验证的字符串
 * @returns {boolean} 是否为空
 */
export const isEmpty = (str) => {
  return str === undefined || str === null || (typeof str === 'string' && str.trim() === '');
};

/**
 * 验证表单字段（返回错误信息）
 * @param {Object} fields - 表单字段对象
 * @param {Object} rules - 验证规则
 * @returns {Object} 错误信息（键为字段名，值为错误提示）
 */
export const validateForm = (fields, rules) => {
  const errors = {};

  // 遍历所有验证规则
  Object.keys(rules).forEach((field) => {
    const value = fields[field];
    const fieldRules = rules[field];

    // 检查必填
    if (fieldRules.required && isEmpty(value)) {
      errors[field] = fieldRules.message || `${field}不能为空`;
      return; // 若必填验证失败，不再检查其他规则
    }

    // 检查格式验证（如邮箱、手机号）
    if (fieldRules.validator && value !== undefined && value !== null) {
      const isValid = fieldRules.validator(value);
      if (!isValid) {
        errors[field] = fieldRules.message || `${field}格式不正确`;
      }
    }

    // 检查最小长度
    if (fieldRules.minLength && value && value.length < fieldRules.minLength) {
      errors[field] = fieldRules.message || `${field}长度不能少于${fieldRules.minLength}位`;
    }
  });

  return errors;
};
    

/**
 * 验证中国大陆身份证号（18位）
 * 支持格式校验和校验码验证
 * @param {string} idCard - 待验证的身份证号
 * @returns {boolean} 是否为有效身份证号
 */
export const isIdCard = (idCard) => {
  if (!idCard) return false;
  
  // 1. 基本格式校验：18位，前17位为数字，最后一位为数字或X（不区分大小写）
  const regex = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/;
  if (!regex.test(idCard)) {
    return false;
  }

  // 2. 校验码验证（根据国家标准GB 11643-1999）
  // 加权因子
  const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  // 校验码对应值
  const checkCodeMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  
  // 计算前17位与加权因子乘积的和
  let sum = 0;
  for (let i = 0; i < 17; i++) {
    sum += parseInt(idCard[i], 10) * weights[i];
  }
  
  // 计算校验码
  const checkCodeIndex = sum % 11;
  const calculatedCheckCode = checkCodeMap[checkCodeIndex];
  // 实际校验码（最后一位，统一转为大写）
  const actualCheckCode = idCard[17].toUpperCase();
  
  return calculatedCheckCode === actualCheckCode;
};

/**
 * 从身份证号中提取生日
 * @param {string} idCard - 有效的身份证号
 * @returns {string} 生日（格式：YYYY-MM-DD，无效则返回空）
 */
export const getBirthdayFromIdCard = (idCard) => {
  if (!isIdCard(idCard)) return '';
  // 身份证号第7-14位为生日（YYYYMMDD）
  const year = idCard.substring(6, 10);
  const month = idCard.substring(10, 12);
  const day = idCard.substring(12, 14);
  return `${year}-${month}-${day}`;
};

/**
 * 从身份证号中提取性别
 * @param {string} idCard - 有效的身份证号
 * @returns {string} 性别（"男"、"女"，无效则返回空）
 */
export const getGenderFromIdCard = (idCard) => {
  if (!isIdCard(idCard)) return '';
  // 第17位数字：奇数为男，偶数为女
  const genderCode = parseInt(idCard[16], 10);
  return genderCode % 2 === 1 ? '男' : '女';
};
    